package auctionatr

import java.util.Date

import org.codehaus.groovy.grails.commons.ConfigurationHolder

/**
 * Die Klasse Bid definiert die Attribute jedes Gebots.
 * Jedes Gebot ist genau einer Auktion und einem User (=Bieter) zugewiesen.
 * 
 * @author Can Paul
 *
 */

class Bid {

	/**
	 * Bei der Abgabe eines Gebots müssen gewisse Bedingungen erfüllt sein. Die Validierung erfolgt mithilfe der constraints.
	 * 
	 * @gebot Das abzugebende Gebot muss mindestens EUR 0,50 über dem zu dem Zeitpunkt höchsten Gebot liegen. Ein User kann keine Gebote auf seine eigene Auktion abgeben. Ein Gebot kann nur für eine laufende Auktion abgegeben werden.
	 * @dateCreated Der Zeitpunkt der Gebotsabgabe muss vor dem Auktionsende liegen.
	 */
	static constraints = {
		gebot(blank:false, nullable: false, validator: { gebot, obj ->
			// finde Gebote, die größer als Gebot-x euro sind.
			def lastBid = Bid.findAllByAuctionsAndGebotGreaterThan(obj.properties['auctions'],(gebot-ConfigurationHolder.config.nextBid))
			// finde die Auktion, auf die geboten wird (für Startpreis)
			def auction = Auction.findById(obj.properties['auctions'].id)

			// wenn mind. x euro mehr geboten wurde, als Startpreis bzw. letztes Gebot --> valides Gebot
			// zusaetzlich noch prüfen, ob Auktion noch läuft
			if(lastBid.isEmpty() && gebot-ConfigurationHolder.config.nextBid >= auction['startPrice']) {

			} else {
				return false
			}
		},scale:2) // gebot Ende
		dateCreated(validator: {val, obj ->
			if(new Date() < obj.properties['auctions'].finishDate) {
				return true;
			} else {
				return false;
			}
			
			})
		
		
	}

	/** Die Höhe des Gebots. */ 
	BigDecimal gebot
	
	/** Das Erstellungsdatum ist der Zeitpunkt, an dem ein Gebot abgegeben wird. */  
	Date dateCreated

	/** Das Gebot wird in den Datentyp String umgewandelt. */
	String toString () {
		return gebot + " €"
	}
	/** Jedes Gebot wird einer Auktion und einem User (Bieter) zugewiesen. */
	static belongsTo = [auctions : Auction, users : User]
}
